home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Libris Britannia 4
/
science library(b).zip
/
science library(b)
/
CUGUK
/
APPLICAT
/
C034.ZIP
/
DBQSEL2.C
< prev
next >
Wrap
Text File
|
2010-11-01
|
6KB
|
313 lines
/* SDB - select items from database - part 2 */
#include "bdscio.h"
#include "dbqdefs.h"
get_srels(slptr)
struct sel *slptr;
{
char rname[KEYWORDMAX+1],*aname;
while (TRUE) {
if (db_ntoken() != ID)
{ RETERR(SYNTAX) }
strcpy(rname,dbv_tstring);
if (db_token() == ID) {
db_ntoken();
aname = dbv_tstring;
}
else
aname = NULL;
if (!srelation(slptr,rname,aname))
return (FALSE);
if (db_token() != ',')
break;
db_ntoken();
}
return (TRUE);
}
srelation(slptr,rname,aname)
struct sel *slptr; char *rname,*aname;
{
struct srel *srptr,*newsrel;
if ((newsrel = CALLOC(SRELSIZE)) == NULL)
{ RETERR(INSMEM) }
newsrel->sr_ctuple = FALSE;
newsrel->sr_update = FALSE;
newsrel->sr_next = NULL;
if ((newsrel->sr_scan = db_ropen(rname)) == NULL) {
CFREE(newsrel);
return (FALSE);
}
if (aname != NULL) {
if ((newsrel->sr_name = CALLOC(strlen(aname)+1)) == NULL) {
CFREE(newsrel);
RETERR(INSMEM)
}
strcpy(newsrel->sr_name,aname);
}
else
newsrel->sr_name = NULL;
for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next)
if (srptr->sr_next == NULL)
break;
if (srptr == NULL)
slptr->sl_rels = newsrel;
else
srptr->sr_next = newsrel;
return (TRUE);
}
int check_attrs(slptr)
struct sel *slptr;
{
struct sattr *saptr;
if (slptr->sl_rels == NULL)
{ RETERR(RELFNF) }
if (slptr->sl_attrs == NULL)
return (all_attrs(slptr));
for (saptr = slptr->sl_attrs; saptr != NULL; saptr = saptr->sa_next)
if (!find_attr(slptr,saptr->sa_rname,saptr->sa_aname,
&saptr->sa_aptr,&saptr->sa_srel,&saptr->sa_attr))
return (FALSE);
return (TRUE);
}
int all_attrs(slptr)
struct sel *slptr;
{
struct sattr *newsattr,*lastsattr;
struct srel *srptr;
struct attribute *aptr;
int i,astart;
lastsattr = NULL;
for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next) {
astart = 1;
for (i = 0; i < NATTRS; i++) {
aptr = &srptr->sr_scan->sc_relation->rl_header.hd_attrs[i];
if (aptr->at_name[0] == 0)
break;
if ((newsattr = CALLOC(SATSIZE)) == NULL)
{ RETERR(INSMEM) }
newsattr->sa_name = NULL;
newsattr->sa_total = NULL;
newsattr->sa_srel = srptr;
newsattr->sa_aptr = srptr->sr_scan->sc_tuple + astart;
newsattr->sa_attr = aptr;
newsattr->sa_next = NULL;
if ((newsattr->sa_rname = CALLOC(RNSIZE+1)) == NULL) {
CFREE(newsattr);
RETERR(INSMEM)
}
strncpy(newsattr->sa_rname,
srptr->sr_scan->sc_relation->rl_name,RNSIZE);
newsattr->sa_rname[RNSIZE] = 0;
if (dbv_total && (aptr->at_type == TNUM)) {
if ((newsattr->sa_total = CALLOC(4)) == NULL) {
if (newsattr->sa_rname != NULL)
CFREE(newsattr->sa_rname);
CFREE(newsattr);
RETERR(INSMEM)
}
setmem(newsattr->sa_total,4,NULL);
} else
newsattr->sa_total = NULL;
if ((newsattr->sa_aname = CALLOC(ANSIZE+1)) == NULL) {
CFREE(newsattr->sa_rname);
CFREE(newsattr);
RETERR(INSMEM)
}
strncpy(newsattr->sa_aname,
srptr->sr_scan->sc_relation->rl_header.hd_attrs[i].at_name,
ANSIZE);
newsattr->sa_aname[ANSIZE] = 0;
if (lastsattr == NULL)
slptr->sl_attrs = newsattr;
else
lastsattr->sa_next = newsattr;
lastsattr = newsattr;
astart += aptr->at_size;
}
}
return (TRUE);
}
int find_attr(slptr,rname,aname,paptr,psrel,pattr)
struct sel *slptr; char *rname,*aname;
char **paptr; struct attribute **pattr;
{
if (rname == NULL)
return (uattr(slptr,aname,paptr,psrel,pattr));
else
return (qattr(slptr,rname,aname,paptr,psrel,pattr));
}
int uattr(slptr,aname,paptr,psrel,pattr)
struct sel *slptr; char *aname;
char **paptr; struct srel **psrel; struct attribute **pattr;
{
struct srel *srptr;
struct attribute *aptr;
int i,astart;
*pattr = NULL;
for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next) {
astart = 1;
for (i = 0; i < NATTRS; i++) {
aptr = &srptr->sr_scan->sc_relation->rl_header.hd_attrs[i];
if (aptr->at_name[0] == 0)
break;
if (db_sncmp(aname,aptr->at_name,ANSIZE) == 0) {
if (*pattr != NULL)
{ RETERR(ATAMBG) }
*paptr = srptr->sr_scan->sc_tuple + astart;
*psrel = srptr;
*pattr = aptr;
}
astart += aptr->at_size;
}
}
if (*pattr == NULL)
{ RETERR(ATUNDF) }
return (TRUE);
}
int qattr(slptr,rname,aname,paptr,psrel,pattr)
struct sel *slptr; char *rname,*aname;
char **paptr; struct srel **psrel; struct attribute **pattr;
{
struct srel *srptr;
struct attribute *aptr;
char *crname;
int i,astart;
*pattr = NULL;
for (srptr = slptr->sl_rels; srptr != NULL; srptr = srptr->sr_next) {
if ((crname = srptr->sr_name) == NULL)
crname = srptr->sr_scan->sc_relation->rl_name;
if (db_sncmp(rname,crname,RNSIZE) == 0) {
astart = 1;
for (i = 0; i < NATTRS; i++) {
aptr = &srptr->sr_scan->sc_relation->rl_header.hd_attrs[i];
if (aptr->at_name[0] == 0)
break;
if (db_sncmp(aname,aptr->at_name,ANSIZE) == 0) {
*paptr = srptr->sr_scan->sc_tuple + astart;
*psrel = srptr;
*pattr = aptr;
return (TRUE);
}
astart += aptr->at_size;
}
RETERR(ATUNDF)
}
}
RETERR(RLUNDF)
}
int process(srptr)
struct srel *srptr;
{
if (srptr->sr_next == NULL) {
if (!srptr->sr_ctuple)
db_rbegin(srptr->sr_scan);
return (srptr->sr_ctuple = db_rfetch(srptr->sr_scan));
}
if (!srptr->sr_ctuple) {
db_rbegin(srptr->sr_scan);
if (!db_rfetch(srptr->sr_scan))
return (FALSE);
}
while (!process(srptr->sr_next))
if (!db_rfetch(srptr->sr_scan))
return (srptr->sr_ctuple = FALSE);
return (srptr->sr_ctuple = TRUE);
}
db_aget(aptr,vptr,avalue)
struct attribute *aptr; char *vptr,*avalue;
{
int i;
for (i = 0;i < aptr->at_size; i++)
*avalue++ = vptr[i];
*avalue = EOS;
}
db_aput(aptr,vptr,avalue)
struct attribute *aptr; char *vptr,*avalue;
{
int i;
i = 0;
if (aptr->at_type == TNUM)
for (; i < aptr->at_size - strlen(avalue); i++)
vptr[i] = ' ';
for (; i < aptr->at_size; i++)
if (*avalue == 0)
vptr[i] = 0;
else
vptr[i] = *avalue++;
}
vptr[i] = ' ';
for (; i < aptr->at_size; i++)
if (*avalue == 0)
vptr[i